# -*- coding: utf-8 -*-
#*******************************************************************************
#   工作线程                                          
#   1.和特定的tab界面对应                                                        
#   2.完成下载工作                                                               
#*******************************************************************************
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtGui import QPixmap

import threading
import time

# tab页面UI
from customui import *

# 每个链接对应的下载工作线程
class Ergate(threading.Thread):
    class_tag='Ergate'

    def __init__(self,ui=None,loader=None,main_ui=None):
        threading.Thread.__init__(self)
        self.mui=main_ui                            # 主界面
        self.ui=ui                                  # tab界面
        self.loader=loader                          # 漫画的解析下载器
        self.checkbox_list=[]                       # 卷信息列表
        self.labels=[]                              # 占位组件
        self.comic_url=None                         # 解析链接
        self.choice_list=False                      # 是否有选择了卷下载
        self.workover=False                         # 线程工作标志
        self.pick_vols_over=False                   # 卷解析完成标志 
        self.unit_idx=0                             # 任务单元编号

        self.patchs()                               # 补丁

    # 添加各种事件触发：按钮与进度条
    def patchs(self):
        self.ui.btn_clear.clicked.connect(self.button_clear_pressed)
        self.ui.btn_all.clicked.connect(self.button_all_pressed)
        self.ui.btn_down.clicked.connect(self.button_down_pressed)
        self.ui.btn_vols.clicked.connect(self.button_vols_pressed)
        self.ui.probar_down_pics.valueChanged.connect(self.update_progressbar)       # 进度条

    # 重设标志
    def reset(self,again=False):
        if again:
            self.pick_vols_over=False
            self.loader.reset()
            

    # 线程工作 
    # 解析漫画首页信息 
    # while 线程工作：
    #   等待用户选择            
    #   下载选择卷             
    #   下载对应漫画页         
    #   更新进度条             
    #   等待下个任务          
    def run(self):
        comic,loader=self.loader.comic,self.loader
        print("resolver thread start working")
        loader.parse()
        print("total vols",len(comic.vols))
        # 解析卷信息完成发送信号
        self.ui.btn_vols.clicked.emit()
        again=False
        # 工作线程：除非关闭tab页，否则持续工作
        while not self.workover:
            self.reset(again)
            again=True
            print('wait for choice')
            # 等待用户选择
            while not self.workover and not self.pick_vols_over:
                pass
            else:
                if self.workover: return
            loader.work()
            print('vols down begin')
            # 等待卷下载解析完成
            while not self.workover and not loader.load_vols_over:
                pass
            else:
                if self.workover: return
            # 开始下载页，并更新进度条
            print("progress bar work")
            self.ui.probar_down_pics.valueChanged.emit(-1)   # 设定进度条最大值,更新不能太频繁
            while not self.workover and not loader.comic_down_over:
                print(loader.load_pics,'/',loader.pics_number)
                self.ui.probar_down_pics.valueChanged.emit(loader.load_pics)
                time.sleep(2)
            else:
                if self.workover: return
                self.ui.probar_down_pics.valueChanged.emit(loader.load_pics)
            # 一次下载结束
            print("down load over")

    # 清除按钮：清楚当前所有选项
    def button_clear_pressed(self):
        print("clear button has been pushed")
        for cb in self.checkbox_list:
            cb.setChecked(False)
    
    # 全选按钮：选择当前所有的卷
    def button_all_pressed(self):
        print("all button has been pushed")
        for cb in self.checkbox_list:
            cb.setChecked(True)

    # 接到更新信号之后开始更新进度条
    def update_progressbar(self,val):
        if val==-1:
            self.ui.probar_down_pics.setMaximum(self.loader.pics_number)
        else:
            self.ui.probar_down_pics.setValue(val)

    # 下载按钮 
    # 检测是否存在选定卷：提示
    # 开始下载过程
    def button_down_pressed(self):
        print("down button has been pushed")
        for cb in self.checkbox_list:
            if cb.isChecked():
                self.choice_list=True
                self.loader.add_down_vols(cb.vol)
        if not self.choice_list:
            QMessageBox.information(self.ui,"下载提示","您没有选择任何指定的卷",QMessageBox.Yes)
        else:
            self.choice_list=False
            self.pick_vols_over=True
        
    # 卷信息显示按钮触发 
    # 在tab界面的滚动区更新信息
    # 并且更新显示封面，简介
    def button_vols_pressed(self):
        func_tag='buttonVolsPressed'
        print(self.class_tag,func_tag,'work start')
        idx,idy=1,1
        comic=self.loader.comic
        for vol in comic.vols:
            cb=CCCheckBox(vol)
            self.ui.gridLayout.addWidget(cb,idx,idy)
            self.checkbox_list.append(cb)
            idx+=1
            if idx>=21: idx,idy=1,idy+1
        # 为了整体布局一列不足的部分补足
        while idx<21:
            label=QLabel('')
            self.ui.gridLayout.addWidget(label,idx,idy)
            self.labels.append(label)
            idx+=1
        # 更新封面
        pixmap_cover=QPixmap(self.loader.comic_cover_path)
        self.ui.lb_cover.setPixmap(pixmap_cover)
        self.ui.lb_cover.resize(pixmap_cover.size())
        # 向主界面发送加载tab页的信号
        print('send add tab singal')
        self.mui.ui.body.tabBarClicked.emit(self.unit_idx)
        print(self.class_tag,func_tag,'work over')